//package com.shiwen.wiki.aspect;
//
//import com.alibaba.fastjson.JSONObject;
//import com.alibaba.fastjson.support.spring.PropertyPreFilters;
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.Signature;
//import org.aspectj.lang.annotation.*;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.stereotype.Component;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//import org.springframework.web.multipart.MultipartFile;
//
//import jakarta.servlet.ServletRequest;
//import jakarta.servlet.ServletResponse;
//import jakarta.servlet.http.HttpServletRequest;
//
//@Aspect
//@Component
//public class LogAspect {
//
//    private final static Logger LOG = LoggerFactory.getLogger(LogAspect.class);
//
//    /** 定义一个切点 */
//    @Pointcut("execution(public * com.shiwen.*.controller..*Controller.*(..))")
//    public void controllerPointcut() {}
//
//    @Before("controllerPointcut()")
//    public void doBefore(JoinPoint joinPoint) throws Throwable {
//
//        // 开始打印请求日志
//        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//        HttpServletRequest request = attributes.getRequest();
//        Signature signature = joinPoint.getSignature();
//        String name = signature.getName();
//
//        // 打印请求信息
//        LOG.info("------------- 开始 -------------");
//        LOG.info("请求地址: {} {}", request.getRequestURL().toString(), request.getMethod());
//        LOG.info("类名方法: {}.{}", signature.getDeclaringTypeName(), name);
//        LOG.info("远程地址: {}", request.getRemoteAddr());
//
//        // 打印请求参数
//        Object[] args = joinPoint.getArgs();
//		// LOG.info("请求参数: {}", JSONObject.toJSONString(args));
//
//		Object[] arguments  = new Object[args.length];
//        for (int i = 0; i < args.length; i++) {
//            if (args[i] instanceof ServletRequest
//                    || args[i] instanceof ServletResponse
//                    || args[i] instanceof MultipartFile) {
//                continue;
//            }
//            arguments[i] = args[i];
//        }
//        // 排除字段，敏感字段或太长的字段不显示
//        String[] excludeProperties = {"password", "file"};
//        PropertyPreFilters filters = new PropertyPreFilters();
//        PropertyPreFilters.MySimplePropertyPreFilter excludefilter = filters.addFilter();
//        excludefilter.addExcludes(excludeProperties);
//        LOG.info("请求参数: {}", JSONObject.toJSONString(arguments, excludefilter));
//    }
//
//    @Around("controllerPointcut()")
//    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//        long startTime = System.currentTimeMillis();
//        Object result = proceedingJoinPoint.proceed();
//        // 排除字段，敏感字段或太长的字段不显示
//        String[] excludeProperties = {"password", "file"};
//        PropertyPreFilters filters = new PropertyPreFilters();
//        PropertyPreFilters.MySimplePropertyPreFilter excludefilter = filters.addFilter();
//        excludefilter.addExcludes(excludeProperties);
//        LOG.info("返回结果: {}", JSONObject.toJSONString(result, excludefilter));
//        LOG.info("------------- 结束 耗时：{} ms -------------", System.currentTimeMillis() - startTime);
//        return result;
//    }
//
//}